package jmine.tec.persist.schema.impl.parsers;

import java.util.LinkedList;
import java.util.List;

import jmine.tec.persist.schema.api.SchemaElement;
import jmine.tec.persist.schema.api.SchemaElementParser;

/**
 * Parser composto de uma lista de parsers, delega para o primeiro parser que for apropriado para o statement.
 * 
 * @author lundberg
 * @param <S> tipo de schema element gerado
 */
public class CompositeParser<S extends SchemaElement> implements SchemaElementParser<S> {

    private List<SchemaElementParser<S>> parsers;

    /**
     * Construtor
     */
    public CompositeParser() {
        this.parsers = new LinkedList<SchemaElementParser<S>>();
    }

    /**
     * Adiciona um novo parser à lista do parser composto
     * 
     * @param parser novo parser
     */
    public void addParser(SchemaElementParser<S> parser) {
        this.parsers.add(parser);
    }

    /**
     * {@inheritDoc}
     */
    public S parse(String statement) {
        for (SchemaElementParser<S> parser : this.parsers) {
            if (parser.matches(statement)) {
                return parser.parse(statement);
            }
        }
        throw new IllegalStateException();
    }

    /**
     * {@inheritDoc}
     */
    public boolean matches(String statement) {
        for (SchemaElementParser<S> parser : this.parsers) {
            if (parser.matches(statement)) {
                return true;
            }
        }
        return false;
    }
}
